package com.game.Maze;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.game.Maze.Objects.Maze;
import com.game.Maze.Objects.MazeException;
import com.game.Maze.Renderers.GameRenderer;

/**
 * Объект который реализует функционал игры (создание лабиринта, рендеринг объектов)
 * 
 */
public class MazeGame implements ApplicationListener, IGameEvents
{
  // Лабиринт
  private Maze m_Maze = null;

  private GameRenderer m_Renderer = null;
  private GameInput m_Input = null; 

  public MazeGame()
  {
    createNewGame();
  }
  
  private void updateRenderer()
  {
    if (null != m_Renderer)
    {
      m_Renderer.setMaze(m_Maze);
      m_Renderer.create(0, 0);
    }
  }

  @Override
  public void create()
  {
    m_Renderer = new GameRenderer(m_Maze);
    m_Input = new GameInput(this);
    Gdx.input.setInputProcessor(m_Input);
  }

  @Override
  public void resume()
  {
  }

  @Override
  public void render()
  {
    m_Renderer.render(null);
  }

  @Override
  public void resize(int width, int height)
  {
    m_Renderer.resize(width, height);
  }

  @Override
  public void pause()
  {
  }

  @Override
  public void dispose()
  {
  }

  private static class MazeGameHolder
  {
    public static final MazeGame instance = new MazeGame();
  }

  public static MazeGame instance()
  {
    return MazeGameHolder.instance;
  }


  /**
   * Создает новый лабиринт
   */
  @Override
  public void createNewGame()
  {
    try
    {
      m_Maze = new Maze(10);
      m_Maze.generate();
    } catch (MazeException e)
    {
      // TODO Подумать что делать с исключениями
      e.printStackTrace();
    }

    updateRenderer();
  }
}
